package com.haruhi.example;

import com.haruhi.event.MessageConsumer;
import com.haruhi.ws.client.AbstractClientEndpoint;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ClientStart {

    public static void main(String[] args) throws URISyntaxException, ExecutionException, InterruptedException, IOException, ClassNotFoundException {

        // 指定某个包路径 该路径下所有的MessageHandler接口的实现类 都会注册为消息处理者
        MessageConsumer.start("com.haruhi.example");

        HashMap<String, String> header = new HashMap<>();
        header.put("Authorization","Token haruhi124");// 设置ws握手请求时的请求头

        // 创建一个客户端实例 要连接多个服务端 就创建多个实例
        AbstractClientEndpoint defaultClientEndpoint = new AbstractClientEndpoint("ws://127.0.0.1:8091/ws/bot2", header, 100L){
            // 这里可以重写这个抽象父类的一些方法
        };

        // 连接方式一 判断是否连接成功 失败则主动调用重连方法
        if (!defaultClientEndpoint.connect(false)) {
            Future<Boolean> future = defaultClientEndpoint.reConnect();
            try {
//                future.get(); // 不重连成功就一直阻塞 不往下执行
                future.get(1L, TimeUnit.SECONDS); // 等待指定时长 时长结束不成功就往下执行
            } catch (TimeoutException e) {
                future.cancel(true);//中断重连线程   可以不中断，这样它还会一直在做重连 只是变成了异步去做
                System.out.println("超过1秒还未重连成功"+e.getMessage());
            }
        }


        // 连接方式二 若连接失败 会自动开启重连任务（异步）
//        defaultClientEndpoint.connect(true);

        // 以上两种方式 都是在对刚实例化一个WsClientEndpoint对象时做的处理 如果连接成功之后，发生了连接断开情况，那么会自动开一个重连线程

        // 方式三  你可以通过继承AbstractClientEndpoint类 来自定义一个客户端端点
        try {
            HashMap<String, String> header1 = new HashMap<>();
            header1.put("Authorization","Token haruhi124");// 设置ws握手请求时的请求头

            MessageConsumer.start("com.haruhi.example");

            // 实例化一个你自定义的客户端点
            MyClientEndpoint endpoint = new MyClientEndpoint("ws://127.0.0.1:8091/ws/bot2", header1, 1000L);
            endpoint.connect(true);

        } catch (URISyntaxException | IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        while (true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


//        try {
//            HttpServer httpServer = HttpServer.create(new InetSocketAddress(8888), 0);
//            httpServer.setExecutor(Executors.newFixedThreadPool(10));
//            httpServer.createContext("/test", new HttpHandler() {
//                @Override
//                public void handle(HttpExchange httpExchange) throws IOException {
//                    System.out.println(Thread.currentThread().getName() + "  " +httpExchange);
//                }
//            });
//
//
//            httpServer.createContext("/test11", new HttpHandler() {
//                @Override
//                public void handle(HttpExchange httpExchange) throws IOException {
//                    System.out.println(Thread.currentThread().getName() + "  " +httpExchange);
//                }
//            });
//
//            httpServer.start();
//
//            System.out.println("13131233");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

//        while (true){
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }

    }
}
